package com.kotlin.flong.flow

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.runBlocking

/**
 * @Author:liangjl
 * @Date: 2020/7/11-11:02
 * @Eamil:jilongliang@sina.com
 * @Description:
 * 1、借助于flowOn，可以让Flow在发射元素时所处的上下文与收集(终止操作)时所处的上下文是不同的
 * 2、值得注意的是：flowOn运算符改变了Flow本身默认的顺序性
 * 3、现在，收集操作实际是发生在一个协程当中，而发射操作发生在另一个协程当中(这点比较重要)
 * 4、-Dkotlinx.coroutines.debug
 * 5、flowOn运算符本质是会改变上下文中的CoroutineDispatcher,并且为上游的flow创建另外一个协程
 *
 */
private fun log(logMsg: String) = println("[${Thread.currentThread().name}] $logMsg")

private fun myMethod(): Flow<Int> = flow {
    for (i in 1..4) {
        Thread.sleep(100)
        //流发射
        emit(i)
        log(" emit $i" )
    }
}.flowOn(Dispatchers.Default)

fun main() = runBlocking {
    myMethod().collect { it->
        log(" collect $it" )
    }
}

